package main

import (
	"sync"
	"sync/atomic"
)

type DBPool struct {
	Host     string
	Port     int
	UserName string
}

var dbPoolIns *DBPool
var lock sync.Mutex
var initialized uint32

// 有问题的方法，并发
// 加锁 - 功能上没有问题，但是性能不好
// 高并发下，有bug
// goroutine1 进来,实例化dbPoolIns = &DBPool{}进想到一半，goroutine2进来，读到dbPoolIns != nil，返回dbPoolIns
func GetDBPool() *DBPool {
	if atomic.LoadUint32(&initialized) == 1 {
		return dbPoolIns
	}
	lock.Lock()
	defer lock.Unlock()

	if initialized == 0 {
		dbPoolIns = &DBPool{}
		//原子操作   一旦有一个线程执行到了atomic.LoadUint32(&initialized)   initialized就会被保护 确保initialized的原子性
		atomic.StoreUint32(&initialized, 1)
	}
	return dbPoolIns
}

var once sync.Once

func GetDBPool2() *DBPool {
	once.Do(func() {
		dbPoolIns = &DBPool{}
	})
	return dbPoolIns
}
func main() {

}
